package br.com.sgpv2.entity.pessoa;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import br.com.sgpv2.entity.dependente.Dependente;
import br.com.sgpv2.entity.organograma.Entidade;
import br.com.sgpv2.entity.pessoa.documentacao.Documentacao;
import br.com.sgpv2.entity.pessoa.endereco.Endereco;


/**
 * Representa uma entidade Pessoa no sistema.
 */
@Entity
@Table(name = "pes_pessoa")
@SequenceGenerator(name = "sequencePessoa", sequenceName = "pes_pessoa_pes_id_seq")
public class Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;
	private int id;
	private String nome;
	private String dataNascimento;
	private Endereco endereco;
	private EstadoCivilEnum estadoCivil;
	private SexoEnum sexo;
	private String dataObito;
	private String filiacaoPai;
	private String filiacaoMae;
	private RacaCorEnum racaCor;
	private boolean ehDeficiente;
	private TipoDeficienciaEnum tipoDeficiencia;
	private GrauEscolaridadeEnum grauEscolaridade;
	private String curso;
	private String instituicaoEnsino;
	private String dataInicalCurso;
	private String dataFimCurso;
	private Documentacao documentacao;
	private String cpfPai;
	private String cpfMae;
	private List<Dependente> dependentes;
	private List<Contrato> contratos;
	private Entidade entidade;
	

	/**
	 * Recupera o valor do ID da entidade.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "pes_id", nullable = false)
	public int getId() {
		return id;
	}

	/**
	 * Configura o valor do ID da entidade.
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Recupera o nome da pessoa.
	 */
	@Column(name = "pes_nome")
	public String getNome() {
		return nome;
	}

	/**
	 * Configura o nome da pessoa.
	 * 
	 * @param nome
	 *            nome da pessoa.
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * Recupera a data de nascimento da pessoa.
	 */
	@Column(name = "pes_data_nasc")
	public String getDataNascimento() {
		return dataNascimento;
	}

	/**
	 * Configura a data de nascimento da pessoa.
	 * 
	 * @param dataNascimento
	 *            data de nascimento.
	 */
	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	/**
	 * Recupera o endereço da pessoa.
	 */
	@OneToOne
	@JoinColumn(name = "end_id")
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL })
	public Endereco getEndereco() {
		return endereco;
	}

	/**
	 * Configura o endereço da pessoa.
	 * 
	 * @param endereco
	 *            endereço.
	 */
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	/**
	 * Recupera o estado civil da pessoa.
	 */
	@Column(name = "pes_estado_civil")
	@Enumerated(EnumType.STRING)
	public EstadoCivilEnum getEstadoCivil() {
		return estadoCivil;
	}

	/**
	 * Configura o estado civil da pessoa.
	 * 
	 * @param estadoCivil
	 *            estado civil da pessoa.
	 */
	public void setEstadoCivil(EstadoCivilEnum estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	/**
	 * Recupera o sexo da pessoa.
	 */
	@Column(name = "pes_sexo")
	@Enumerated(EnumType.STRING)
	public SexoEnum getSexo() {
		return sexo;
	}

	/**
	 * Configura o sexo da pessoa.
	 * 
	 * @param sexo
	 *            sexo.
	 */
	public void setSexo(SexoEnum sexo) {
		this.sexo = sexo;
	}

	/**
	 * Recupera a data de óbito da pessoa.
	 */
	@Column(name = "pes_data_obito")
	public String getDataObito() {
		return dataObito;
	}

	/**
	 * Configura a data de óbito da pessoa.
	 * 
	 * @param dataObito
	 *            data de óbito.
	 */
	public void setDataObito(String dataObito) {
		this.dataObito = dataObito;
	}

	/**
	 * Recupera a filiação do pai.
	 */
	@Column(name = "pes_filiacao_pai")
	public String getFiliacaoPai() {
		return filiacaoPai;
	}

	/**
	 * Configura a filiação do pai.
	 * 
	 * @param filiacaoPai
	 *            filiação do pai.
	 */
	public void setFiliacaoPai(String filiacaoPai) {
		this.filiacaoPai = filiacaoPai;
	}

	/**
	 * Recupera a filiação da mãe.
	 */
	@Column(name = "pes_filiacao_mae")
	public String getFiliacaoMae() {
		return filiacaoMae;
	}

	/**
	 * Configura a filiação da mãe.
	 * 
	 * @param filiacaoMae
	 *            filiação da mãe.
	 */
	public void setFiliacaoMae(String filiacaoMae) {
		this.filiacaoMae = filiacaoMae;
	}

	/**
	 * Recupera a raça/cor da pessoa.
	 */
	@Column(name = "pes_raca_cor")
	@Enumerated(EnumType.STRING)
	public RacaCorEnum getRacaCor() {
		return racaCor;
	}

	/**
	 * Configura a raça/cor da pessoa.
	 * 
	 * @param racaCor
	 *            raça/cor.
	 */
	public void setRacaCor(RacaCorEnum racaCor) {
		this.racaCor = racaCor;
	}

	/**
	 * Recupera o tipo de deficiência da pessoa.
	 */
	@Column(name = "pes_tipo_deficiencia")
	@Enumerated(EnumType.STRING)
	public TipoDeficienciaEnum getTipoDeficiencia() {
		return tipoDeficiencia;
	}

	/**
	 * Configura o tipo de deficiência da pessoa.
	 * 
	 * @param tipoDeficiencia
	 *            tipo de deficiência.
	 */
	public void setTipoDeficiencia(TipoDeficienciaEnum tipoDeficiencia) {
		this.tipoDeficiencia = tipoDeficiencia;
	}

	/**
	 * Recupera o grau de escolaridade da pessoa.
	 */
	@Column(name = "pes_grau_escolaridade")
	@Enumerated(EnumType.STRING)
	public GrauEscolaridadeEnum getGrauEscolaridade() {
		return grauEscolaridade;
	}

	/**
	 * Configura o grau de escolaridade da pessoa.
	 * 
	 * @param grauEscolaridade
	 *            grau de escolaridade.
	 */
	public void setGrauEscolaridade(GrauEscolaridadeEnum grauEscolaridade) {
		this.grauEscolaridade = grauEscolaridade;
	}

	/**
	 * Recupera o curso da pessoa.
	 */
	@Column(name = "pes_curso")
	public String getCurso() {
		return curso;
	}

	/**
	 * configura o curso da pessoa.
	 * 
	 * @param curso
	 *            curso.
	 */
	public void setCurso(String curso) {
		this.curso = curso;
	}

	/**
	 * Recupera a instituição de ensino.
	 */
	@Column(name = "pes_instituicao_ensino")
	public String getInstituicaoEnsino() {
		return instituicaoEnsino;
	}

	/**
	 * Configura a instituição de ensino.
	 * 
	 * @param instituicaoEnsino
	 *            instituição de ensino.
	 */
	public void setInstituicaoEnsino(String instituicaoEnsino) {
		this.instituicaoEnsino = instituicaoEnsino;
	}

	/**
	 * Recupera a data incial do curso.
	 */
	@Column(name = "pes_data_inicial_curso")
	public String getDataInicalCurso() {
		return dataInicalCurso;
	}

	/**
	 * Configura a data incial do curso.
	 * 
	 * @param dataInicalCurso
	 *            data incial do curso.
	 */
	public void setDataInicalCurso(String dataInicalCurso) {
		this.dataInicalCurso = dataInicalCurso;
	}

	/**
	 * Recupera a data fim do curso.
	 */
	@Column(name = "pes_data_fim_curso")
	public String getDataFimCurso() {
		return dataFimCurso;
	}

	/**
	 * Configura a data fim do curso.
	 * 
	 * @param dataFimCurso
	 *            data fim do curso.
	 */
	public void setDataFimCurso(String dataFimCurso) {
		this.dataFimCurso = dataFimCurso;
	}

	/**
	 * Recupera a documentação da pessoa.
	 */
	@OneToOne
	@JoinColumn(name = "doc_id")
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL })
	public Documentacao getDocumentacao() {
		return documentacao;
	}

	/**
	 * Configura a documentação da pessoa.
	 * 
	 * @param documentacao
	 *            documentação.
	 */
	public void setDocumentacao(Documentacao documentacao) {
		this.documentacao = documentacao;
	}

	/**
	 * Recupera o cpf do pai.
	 */
	@Column(name = "pes_cpf_pai")
	public String getCpfPai() {
		return cpfPai;
	}

	/**
	 * Configura o CPF do pai.
	 * 
	 * @param cpfPai
	 *            cpf.
	 */
	public void setCpfPai(String cpfPai) {
		this.cpfPai = cpfPai;
	}

	/**
	 * Recupera o cpf da mãe.
	 */
	@Column(name = "pes_cpf_mae")
	public String getCpfMae() {
		return cpfMae;
	}

	/**
	 * Configura o cpf da mãe.
	 * 
	 * @param cpfMae
	 *            cpf.
	 */
	public void setCpfMae(String cpfMae) {
		this.cpfMae = cpfMae;
	}

	/**
	 * Verifica se a pessoa possui deficiência.
	 */
	@Column(name = "pes_possui_deficiencia")
	public boolean isEhDeficiente() {
		return ehDeficiente;
	}

	/**
	 * Configura o indicador de deficiência da pessoa.
	 * 
	 * @param ehDeficiente
	 *            identificador.
	 */
	public void setEhDeficiente(boolean ehDeficiente) {
		this.ehDeficiente = ehDeficiente;
	}

	/**
	 * Recupera a lista de dependentes da pessoa.
	 */
	@OneToMany(mappedBy = "pessoa")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL ,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	public List<Dependente> getDependentes() {
		return dependentes;
	}

	/**
	 * Configura a lista de dependentes da pessoa.
	 */
	public void setDependentes(List<Dependente> dependentes) {
		this.dependentes = dependentes;
	}
	
	/**
	 * Recupera a lista de contratos da pessoa.
	 */
	@OneToMany(mappedBy = "pessoa")
	@LazyCollection(LazyCollectionOption.FALSE)
	@Cascade(value = { org.hibernate.annotations.CascadeType.REMOVE,
			org.hibernate.annotations.CascadeType.ALL ,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	public List<Contrato> getContratos() {
		return contratos;
	}

	/**
	 * Configura a lista de contratos da pessoa.
	 */
	public void setContratos(List<Contrato> contratos) {
		this.contratos = contratos;
	}
	

	/**
	 * Recupera a entidade da pessoa.
	 */
	@ManyToOne
	@JoinColumn(name = "ent_id", nullable = false)
	@LazyCollection(LazyCollectionOption.FALSE)
	public Entidade getEntidade() {
		return entidade;
	}

	/**
	 * Configura o valor do ID da Entidade.
	 */	
	public void setEntidade(Entidade entidade) {
		this.entidade = entidade;
	}	

}
